home *** CD-ROM | disk | FTP | other *** search
- ******************************************************************************
- *
- * WAV Datatype, based on the sourcecode found in OS3.1 Native Developer Kit
- *
- * Written by David N.Junod and Christian Buchner
- *
- ******************************************************************************
- * fastconvert.asm
-
- SECTION Code
-
-
- ; 8 bit unsigned MONO -> 8 bit signed MONO conversion
- ; ===================================================
-
- ; a0=source
- ; a1=destination
- ; d0=destlength
- ;
-
- XDEF _ConvertMono8
-
- _ConvertMono8 move.l d2,-(sp) ; save registers
-
- move.l #$80808080,d2 ; keep EOR value in d2 (faster)
-
- move.l d0,-(sp) ; save len for later use
-
- ; loop for len/4
-
- lsr.l #2,d0 ; divide length by 4
- bra.s loopentrym8 ; enter loop
- outerloopm8 swap d0
-
- innerloopm8 move.l (a0)+,d1 ; get LONGWORD
- eor.l d2,d1 ; convert sign bits
- move.l d1,(a1)+ ; put LONGWORD
-
- loopentrym8 dbra d0,innerloopm8 ; loop length
- swap d0
- dbra d0,outerloopm8
-
- ; loop for len MOD 4
-
- move.l (sp)+,d0 ; get len from stack
- and.l #3,d0 ; calc len MOD 4
- bra.s restentrym8 ; enter loop
-
- restloopm8 move.b (a0)+,d1 ; get BYTE
- eor.b d2,d1 ; convert sign bit
- move.b d1,(a1)+ ; put BYTE
-
- restentrym8 dbra d0,restloopm8
-
- move.l (sp)+,d2 ; restore registers
- rts
-
-
- ; 8 bit unsigned STEREO -> 8 bit signed MONO conversion
- ; =====================================================
-
- XDEF _ConvertStereo8
-
- _ConvertStereo8 move.l d2,-(sp) ; save registers
-
- bra.s loopentrys8 ; enter loop
- outerloops8 swap d0
-
- innerloops8 move.b (a0)+,d1 ; get LEFT UBYTE
- lsr.b #1,d1 ; halve falue
- move.b (a0)+,d2 ; get RIGHT UBYTE
- lsr.b #1,d2 ; halve value
- add.b d2,d1 ; sum up values
- eor.b #$80,d1 ; convert sign bit
- move.b d1,(a1)+ ; put BYTE
-
- loopentrys8 dbra d0,innerloops8 ; loop length
- swap d0
- dbra d0,outerloops8
-
- move.l (sp)+,d2 ; restore registers
- rts
-
-
- ; 16 bit unsigned MONO -> 8 bit signed MONO conversion
- ; ====================================================
-
- XDEF _ConvertMono16
-
- _ConvertMono16 bra.s loopentrym16 ; enter loop
- outerloopm16 swap d0
-
- innerloopm16 move.w (a0)+,d1 ; get WORD
- move.b d1,(a1)+ ; put BYTE
-
- loopentrym16 dbra d0,innerloopm16 ; loop length
- swap d0
- dbra d0,outerloopm16
- rts
-
-
- ; 16 bit unsigned STEREO -> 8 bit signed MONO conversion
- ; ======================================================
-
- XDEF _ConvertStereo16
-
- _ConvertStereo16
- move.l d2,-(sp) ; save registers
-
- bra.s loopentrys16 ; enter loop
- outerloops16 swap d0
-
- innerloops16 move.w (a0)+,d1 ; get left WORD
- move.w (a0)+,d2 ; get right WORD
- asr.b #1,d1 ; halve MSB values
- asr.b #1,d2 ; (Intel format -> LowBytes!)
- add.b d2,d1 ; sum up values
- move.b d1,(a1)+ ; put BYTE
-
- loopentrys16 dbra d0,innerloops16 ; loop length
- swap d0
- dbra d0,outerloops16
-
- move.l (sp)+,d2 ; restore registers
- rts
-
-
-
- END
-